/*
 * SoftwareSAR - 1.0
 */
package br.com.cpqd.ssar.utilitarias;

import java.awt.Color;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;

/**
 * Classe que armazena a lista de fontes eletromagneticas inseridas na simulacao pelo usuario
 * @author Carlos H. S. Santos
 * @version 1.0
 */
public class ListaFontesEletromagneticasSimulacao {

    /*
     * Armazena a lista de vetores inseridas em uma simulacao pelo usuário
     */
    private Vector listaFontesSimulacao;
    /*
     * Nome do arquivo de base de dados das fontes inseridas pelo usuário na simulação do projeto
     */
    String nomeArquivo;
    /*
     * Nome do arquivo de fontes eletromagneticas a serem utilizados pelo FDTD 3D
     */
    String nomeArquivoFDTD;
    /**
     * Modelo para apresentação na Combo Box
     * Guarda a lista de materiais cadastrados pelo usuário
     */
    private DefaultComboBoxModel modeloEditavelSimulacao;
    /*
     * Vetor que armazena os Limites da Simulacao (MinX, MaxX, MinY, MaxY, MinZ, MaxZ)
     */
    private Vector limitesDominio;
    /*
     * Vetor que armazena a quantidade de células em X,Y,Z
     */
    private Vector dimensoesDominio;

    /*
     * Construtor 
     * @param String Nome do arquivo que armazena as fontes eletromagnéticas cadastradas para o projeto
     */
    public ListaFontesEletromagneticasSimulacao() {
        listaFontesSimulacao = new Vector();
    }

    /**
     * Informa o endereco completo do arquivo que contem a base de dados das 
     * informacoes das fontes utilizadas na simulacao
     * @param nomeArquivo String
     */
    public void setArquivoListaFontesSimulacao(String nomeArquivo) {
        this.nomeArquivo = nomeArquivo;
    }

    /*
     * Método privado que inicializa a lista de fontes eletromagnéticas de um projeto
     * que foram armazenadas na base de dados.
     */
    private void carregarListaFontes() throws FileNotFoundException, IOException {

        // Reiniciando a listagem de fontes eletromagneticas
        listaFontesSimulacao = new Vector();
        Color cor;
        String str = null;
        String name = new String();
        StringTokenizer strtoken = null;
        FonteEletromagneticaSimulacao fonte;


        // Verificando se o Arquivo Existe, se não existir ele cria um em branco      
        File arq = new File(nomeArquivo);
        if (!arq.exists()) { // se arquivo não existir   
            salvarListaFonteSimulacao();
        }


        FileInputStream inputStream = new FileInputStream(nomeArquivo);
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

        try {
            //Descarta as duas primeiras linhas de cabeçalho do arquivo
            reader.readLine();
            reader.readLine();

            modeloEditavelSimulacao = new DefaultComboBoxModel();
            while ((str = reader.readLine()) != null) {
                
                // Tokens                
                strtoken = new StringTokenizer(str);
                fonte = new FonteEletromagneticaSimulacao();
                fonte.setIdFonte(Integer.valueOf(strtoken.nextToken()));
                fonte.setNome(strtoken.nextToken());
                fonte.setIdType(Integer.valueOf(strtoken.nextToken()));
                fonte.setX(Float.valueOf(strtoken.nextToken()));
                fonte.setY(Float.valueOf(strtoken.nextToken()));
                fonte.setZ(Float.valueOf(strtoken.nextToken()));
                cor = new Color(Integer.valueOf(strtoken.nextToken()), Integer.valueOf(strtoken.nextToken()), Integer.valueOf(strtoken.nextToken()));
                fonte.setCor(cor);
                if (fonte.getIdFonte() >= 0) {
                    listaFontesSimulacao.addElement(fonte);
                    modeloEditavelSimulacao.addElement(fonte);
                }
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ListadeTiposFontesEletromagneticas.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /*
     * Adicionar fonte eletromagnática na lista de fontes do Projeto
     *@param FonteEletromagneticaSimulacao fonte
     */
    public FonteEletromagneticaSimulacao adicionarFonteSimulacao(FonteEletromagneticaSimulacao fonte) {
        fonte.setIdFonte(listaFontesSimulacao.size());
        this.listaFontesSimulacao.add(fonte);
        return fonte;
    }

    public void iniciarFontesEletromagneticasSimulacao() {
        try {
            carregarListaFontes();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ListaFontesEletromagneticasSimulacao.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ListaFontesEletromagneticasSimulacao.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /*
     * Editar fonte eletromagnática da lista de fontes do Projeto
     *@param int id, FonteEletromagneticaSimulacao fonte
     */
    public void editarFonteSimulacao(FonteEletromagneticaSimulacao fonte) {
        FonteEletromagneticaSimulacao temp = new FonteEletromagneticaSimulacao();
        for (int cont = 0; cont < listaFontesSimulacao.size(); cont++) {
            temp = (FonteEletromagneticaSimulacao) listaFontesSimulacao.get(cont);
            if (temp.getIdFonte() == fonte.getIdFonte()) {
                listaFontesSimulacao.set(cont, fonte);
            }

        }
    }

    /*
     * Remover determinada fonte da lista de Fontes do Projeto
     *@param FonteEletromagneticaSimulacao fonte
     */
    public boolean removerFonteSimulacao(FonteEletromagneticaSimulacao fonte) {

        boolean removido = false;
        FonteEletromagneticaSimulacao temp = new FonteEletromagneticaSimulacao();
        for (int cont = 0; cont < listaFontesSimulacao.size(); cont++) {
            temp = (FonteEletromagneticaSimulacao) listaFontesSimulacao.get(cont);
            if (temp.getIdFonte() == fonte.getIdFonte()) {
                listaFontesSimulacao.removeElementAt(cont);
                removido = true;
            }
        }
        return removido;
    }

    /**
     * Salvando a listagem de fontes eletromagneticas adicionadas a simulacao
     * @return verdadeiro boolean
     */
    public boolean salvarListaFonteSimulacao() {
        FonteEletromagneticaSimulacao fonte;
        int cont, i = 0;
        // Carrega Arquivos de Materiais do Usuário
        String cabecalho1 = "// ----- Cadastramento de Fontes Eletromagnéticas Utilizadas no Projeto";
        String cabecalho2 = "idFonte\tNome\t\tidTipoFonte\tx\ty\tz\tRed\tGreen\tBlue";

        try {
            FileWriter filewriter = new FileWriter(nomeArquivo);

            PrintWriter printwriter = new PrintWriter(new BufferedWriter(filewriter));

            // Imprime Primeiro Cabeçalho
            printwriter.println(cabecalho1);
            // Imprime Segundo Cabeçalho
            printwriter.println(cabecalho2);

            // Loop que retorna cada fonte eletromagnetica da simulacao para ser inserida
            // no script de fonts eletromagneticas inseridas
            for (i = 0; i < listaFontesSimulacao.size(); i++) {
                fonte = new FonteEletromagneticaSimulacao();
                fonte = (FonteEletromagneticaSimulacao) listaFontesSimulacao.get(i);
                printwriter.print(fonte.getIdFonte() + "\t\t");
                printwriter.print(fonte.toString());
                printwriter.print("\t" + fonte.getIdType() + "\t");
                printwriter.print("\t" + fonte.getX());
                printwriter.print("\t" + fonte.getY());
                printwriter.print("\t" + fonte.getZ());
                printwriter.print("\t" + fonte.getCor().getRed());
                printwriter.print("\t" + fonte.getCor().getGreen());
                printwriter.print("\t" + fonte.getCor().getBlue());
                printwriter.print("\n");
            }
            printwriter.close();
            filewriter.close();
            return true;

        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    public int size() {
        return listaFontesSimulacao.size();
    }

    public Vector getLista() {
        try {
            carregarListaFontes();
            return this.listaFontesSimulacao;
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ListaFontesEletromagneticasSimulacao.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(ListaFontesEletromagneticasSimulacao.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    /**
     * Get the value of modeloEditavel
     * @return the value of modelo
     */
    public DefaultComboBoxModel getModeloEditavelSimulacao() {
        return modeloEditavelSimulacao;
    }

    /**
     * Indica o endereco e o nome do arquivo de simulacao para a entrada do FDTD
     * @param nome String
     */
    public void setNomeArquivoFDTD(String nome) {
        this.nomeArquivoFDTD = nome;
    }

    /**
     * Armazena os limites das coordenadas da simulacao
     * @param limites Vector
     */
    public void setLimitesSimulacaoFDTD(Vector limites) {
        this.limitesDominio = limites;
    }

    /**
     * Retorna os limites das coordenadas utilizadas pela simulacao
     * @return limites Vector
     */
    public Vector getLimitesSimulacaoFDTD() {
        return this.limitesDominio;
    }

    /**
     * Armazena a quantidade de elementos informada para cada direcao (discretizacao) X,Y,Z
     * @param dimensoes Vector
     */
    public void setDimensoesSimulacaoFDTD(Vector dimensoes) {
        this.dimensoesDominio = dimensoes;
    }

    /**
     * Retorna as dimensoes da simulacao em X,Y,Z
     */
    public Vector getDimensoesSimulacaoFDTD() {
        return this.dimensoesDominio;
    }
    /*
    public void configurarFontesFDTD() {
    try {
    
    carregarListaFontes();
    } catch (FileNotFoundException ex) {
    Logger.getLogger(ListaFontesEletromagneticasSimulacao.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
    Logger.getLogger(ListaFontesEletromagneticasSimulacao.class.getName()).log(Level.SEVERE, null, ex);
    }
    
    FonteEletromagneticaSimulacao fonteSimulacao;
    FonteEletromagnetica fonte;
    ListaFontesEletromagneticas listaFonte;
    TiposdeFonteEletromagnetica tipoFonte;
    ListadeTiposFontesEletromagneticas listaTipoFonte;
    Vector parametros;
    
    int cont, contParam;
    
    // Carrega Arquivos de Materiais do Usuário
    String cabecalho1 = "// ----- Cadastramento de Fontes Eletromagnéticas Utilizadas no FDTD 3D";
    String cabecalho2 = "idFonte\tidTipoFonte\tCampo\tDirecao\tx\ty\tz\tParametros";
    
    FileWriter filewriter;
    try {
    filewriter              = new FileWriter(nomeArquivoFDTD);
    PrintWriter printwriter = new PrintWriter(new BufferedWriter(filewriter));
    listaFonte              = new ListaFontesEletromagneticas();
    listaTipoFonte          = new ListadeTiposFontesEletromagneticas();
    
    // Imprime Primeiro Cabeçalho
    printwriter.println(cabecalho1);
    // Imprime Segundo Cabeçalho
    printwriter.println(cabecalho2);
    
    for (cont = 0; cont < listaFontesSimulacao.size(); cont++) {
    fonteSimulacao  = new FonteEletromagneticaSimulacao();
    fonte           = new FonteEletromagnetica();
    tipoFonte       = new TiposdeFonteEletromagnetica();
    parametros      = new Vector();
    
    fonteSimulacao  = (FonteEletromagneticaSimulacao) listaFontesSimulacao.get(cont);
    fonte           = listaFonte.getFonte(fonteSimulacao.getIdType()-1);
    tipoFonte       = listaTipoFonte.getSourceType(fonte.getIdType());
    printwriter.print(fonteSimulacao.getIdFonte()   + "\t\t");
    printwriter.print(fonte.getIdType()    + "\t\t");
    if (fonte.getField().equals("Elétrico"))
    printwriter.print("e\t");
    else if (fonte.getField().equals("Magnético"))
    printwriter.print("m\t");
    printwriter.print(fonte.getDirection()          + "\t\t");
    printwriter.print(fonteSimulacao.getX()         + "\t");
    printwriter.print(fonteSimulacao.getY()         + "\t");
    printwriter.print(fonteSimulacao.getZ()         + "\t");
    //printwriter.print(tipoFonte.getNParameters()    + "\t\t");
    parametros = fonte.getParameters();
    for (contParam = 0; contParam < tipoFonte.getNParameters(); contParam++) {
    printwriter.print(parametros.get(contParam) + "\t");
    }
    printwriter.print("\n");
    }
    printwriter.close();
    filewriter.close();
    
    
    } catch (IOException ex) {
    Logger.getLogger(ListaFontesEletromagneticasSimulacao.class.getName()).log(Level.SEVERE, null, ex);
    }
    
    }*/

    /**
     * Retorna a fonte eletromagnetica de simulacao de acordo com sua posicao na lista
     * @param index Int
     * @return fonte FonteEletromagneticaSimulacao
     */
    public FonteEletromagneticaSimulacao getFonteSimulacao(int index) {
        return (FonteEletromagneticaSimulacao) listaFontesSimulacao.get(index);
    }
}
